机器人摆动功能开发
修订日期 | 修订版本 | 修订内容 | 修订人 |
---|---|---|---|
2023.03.30 | V0.1 | 初始化文档 | 刘刚 |
2023.04.19 | V0.2 | 增加摆线调用示例 | 赵锦强 |
2025.07.16 | v0.3 | 增加moveP说明 | 李东阳 |
[TOC]
1. 摆动模式
针对某个运动路径,摆动从路径开始一直持续到路径结束,摆动开始点和结束点都位于原始路径上。若摆动是周期性偏离原始路径两侧的运动,则原始路径运动时间是半个摆动周期的整数倍。
摆动形状和焊接速度密切相关,焊接运动速度越快,摆动频率越快(在摆动步长一定的情况下)。摆动形状和摆动步长、幅值也相关,如下图所示:
摆动步长:摆动一个周期内运动的长度
摆动幅值:摆动偏离原始轨迹的最大幅度(两侧幅值不一定相等)
应结合机械臂的性能对摆动幅值进行限制
2. 摆动平面
在焊接过程中,针对 CP(连续轨迹)运动,需定义一个基于工具的运动坐标系TTS来描述工具末端相对于焊缝的摆动方向,如下:
: 路径的切线方向
$Y{TTS}$: 路径的切线方向和工具方向 + $Z{TOOL}$的正交向量方向
$Z{TTS}$: $X{TTS}$和$Y_{TTS}$的正交向量方向
注意:在焊接工艺中,路径切线方向和工具方向不能平行,否则TTS坐标系无法建立
摆动平面的夹角指摆动轨迹(二维)相对于$X{TTS}$和$Y{TTS}$组成平面的夹角。该夹角的范围是(-$\pi$, $\pi$],夹角为0时,摆动平面和TTS的XY平面重合。
①摆动平面夹角为0° ②摆动平面夹角为0°,但工具倾角(焊接工艺角)发生变化 ③摆动平面转动90° ④摆动平面转动180°
如果两个对接工件的厚度不一致,则摆动平面应该偏向更厚的那个工件,使得更多的热量传导到厚的工件上,如下图所示:
①摆动平面没有翻转 ②摆动平面翻转 α,使更多热量传导到厚板上
3. 摆动频率
摆动频率$f$对焊接质量有关键影响,主要取决于摆动步长$s$和焊接速度$v$。最大的摆动频率跟机械臂的动态特性有关(频率共振点和最大速度限制)。
摆动频率$f$[Hz]:= 焊接速度$v $× 1000 / (摆动步长$s $ × 60)
摆动步长$s$[mm]:= 焊接速度$v$ × 1000 / (摆动频率$f $ × 60)
摆动频率和摆动步长的参考值如下表所示:
①允许的区域 ②不建议的区域 ③禁止的区域
4.参数接口
在路径属性PathProperty
的复杂曲线运动属性CurveProperty
的sp
属性中设置.
struct SuperimposedParameters
{
bool enable{false}; // 使能路径叠加功能(在运动路径的法平面内进行叠加)
WeaveType type; // 路径类型(针对焊接应用, 就是摆动类型,比如正弦,摆线)
double step; // 一个周期内在运动方向上移动的距离(摆动步长)
Vector2d amplitude; // 一个周期内在运动叠加方向的最大幅值(不一定对称),当复用为摆线的幅值时,只用第一个元素
Vector2d holdDistance; // 运动到最大幅值处保持的距离(不一定对称),当复用为摆线的宽度时,只用第一个元素
double angle; // 运动叠加方向与法平面的夹角,单位rad
int direction{0}; // 摆线起始摆动方向,0表示在路径方向上方,1表示在路径方向下方
}; // 叠加路径属性
enum WeaveType: int
{
SINE = 0, // 正弦波
SPIRAL = 1, // 摆线
TRIANGLE = 2, // 三角形
TRAPEZOIDAL = 3, // 梯形
};// 摆动类型
其中,如果enable
属性设置成true, 则表示使能路径叠加功能(摆焊).
5.调用示例
5.1 正弦波
ARAL::interface::PathProperty path_property;
path_property.describe_space = ARAL::interface::DescribeSpace::CARTESIAN;
path_property.curProp.type = ARAL::interface::Curvetype::LINE;
path_property.curProp.sp.enable = true;
path_property.curProp.sp.type = ARAL::interface::WeaveType::SINE;
path_property.curProp.sp.step = 0.01;
path_property.curProp.sp.amplitude = {0.005, 0.005};
path_property.curProp.sp.holdDistance = {0.0, 0.0};
path_property.curProp.sp.angle = 0.1;
5.2 摆线
ARAL::interface::PathProperty path_property;
path_property.describe_space = ARAL::interface::DescribeSpace::CARTESIAN;
path_property.curProp.type = ARAL::interface::Curvetype::LINE;
path_property.curProp.sp.enable = true;
property.curProp.sp.step = 0.03;
property.curProp.sp.type = ARAL::interface::WeaveType::SPIRAL;
property.curProp.sp.angle = 0.0;
property.curProp.sp.amplitude = {0.04,0.0}; //当复用为摆线的幅值时,只用第一个元素
property.curProp.sp.holdDistance = {0.03,0.0}; //当复用为摆线的宽度时,只用第一个元素
property.curProp.sp.direction = 0; //摆线起始摆动方向,0表示在路径方向上方,1表示在路径方向下方
6.其他说明
为了使焊缝更加均匀, 一般需要机器人在摆动到最大幅值处停留一段时间,如下图所示:
算法只开放路径几何属性,所以软件需要根据焊接速度将保持时间变成保持距离。
7. moveP说明
简介: moveP是一种曲线类型, 该曲线全部由直线组成, 然后直线和直线之间通过圆弧进行过渡连接. 本质是对直线和直线之间采用圆弧进行交融, 如下图所示:
示教说明: 如下图所示, 以直线L1和直线L2进行说明. 分别依次示教P1, P2, P3. P1姿态ori1根据直线段L1焊接需求设置, P3姿态ori3根据直线段L2焊接需求设置, P2姿态ori2一般设置为姿态ori1和姿态ori3的中间姿态(不用十分精确). 基于用户设置的P1和P3的位姿, 直线段L1的非交融部分将采用姿态ori1进行运动, 直线段L2的非交融部分将采用姿态ori3进行运动, 而在交融段, 则会变姿态运动, 逐渐从姿态ori1变化到姿态ori3(姿态维度, 绕定轴转动, 算法内部处理)
交融说明: 对于路径属性里面的交融半径属性blend_radius{0, 0}, 因为moveP是采用圆弧交融, 所以一般要求L1的右交融半径blend_radius[1]和L2的左交融半径blend_radius[0]设置相等(若不相等, 则会取较小值). 同时, 算法内部会判断, 交融半径设置是否超过直线段总长度, 若超过总长度, 将采取整段交融, 如下图所示, L2就被整段交融了
使用示例
interface::RLJntArray q0;
std::vector<interface::RLPose> poses;
interface::PathProperty path_property;
interface::MoveProperty move_property;
std::vector<interface::PathPoint> pathpoint;
// 示教点
q0 = {9.83416e-11,-0.261799,1.74533,0.436332,1.5708,9.83416e-11}; // 机器人初始关节角(可以理解为P1)
poses = {{0.39014856684,0.05938620560661992,0.2425688174534411,3.141587502980584,-2.059826008490965e-06,1.570819625791458},// P2
{0.3901485668,-0.2597925548508536,0.2425688174534411,3.141587502980584,-2.059826008405779e-06,1.570819625791458}, // P3
{0.683819584,-0.2650062410051318,0.2425688174534414,3.141587502980583,-2.05982600802568e-06,0.06872339964848129}}; // P4
// 设置运动属性和路径属性
move_property.maxV = {0.025,1};
move_property.maxA = {1.2, 1.2};
move_property.maxJ = {9.6, 9.6};
path_property.blend_radius = {0.02, 0.02};
path_property.describe_space = interface::DescribeSpace::CARTESIAN;
path_property.curProp.type = interface::CurveType::MOVEP; // 曲线类型选择moveP
// 添加路点
int N = poses.size();
pathpoint.resize(N);
for(int i = 0; i < N; i++)
pathpoint[i] = generatePathPoint(interface::DescribeSpace::CARTESIAN, i, {}, poses[i]);
for(int i = 0; i < N; i++)
robot->tpAddPositionLine(pathpoint[i], path_property, move_property);
robot->tpSetEndPath();